package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Random;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private RabbitService rabbitService;


	@Override
	public AlbumStatVo getAlbumStatVo(Long albumId) {
		//	调用mapper 层方法
		return albumInfoMapper.selectAlbumStatVo(albumId);
	}

	@Override
	public List<AlbumInfo> findUserAllAlbumListByPage() {
		//	创建page对象
		//		Page<AlbumInfo> page = new Page<>(1,30);
		//		//	构建排序条件
		//		LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<AlbumInfo>().orderByDesc(AlbumInfo::getId);
		//		return albumInfoMapper.selectPage(page,wrapper).getRecords();
		//	select * from album_info order by id desc limit 30;
		//	select id,album_title from album_info order by id desc limit 30;
		//	LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<AlbumInfo>().orderByDesc(AlbumInfo::getId).last(" limit 30 ");
		LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<AlbumInfo>().select(AlbumInfo::getId, AlbumInfo::getAlbumTitle).orderByDesc(AlbumInfo::getId).last(" limit 30 ");
 		return albumInfoMapper.selectList(wrapper);
	}

	@Override
	public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
		//	album_info
		//	创建一个专辑对象
		AlbumInfo albumInfo = new AlbumInfo();
		//	属性拷贝：
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		albumInfo.setId(albumId);
		this.albumInfoMapper.updateById(albumInfo);
		//	album_attribute_value; 需要先删除旧数据，再新增！
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
		//	获取修改之后的数据
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			//	循环遍历
			for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
				//	创建对象
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				//	赋值：album_id
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				//	因为插入操作在当前代码之前 @TableId(type = IdType.AUTO) 这个属性表示能够获取到插入之后的主键Id
				albumAttributeValue.setAlbumId(albumInfo.getId());
				//	循环遍历执行n次insert into;
				albumAttributeValueMapper.insert(albumAttributeValue);
			}
			//	可以优化变为批量保存.
		}

		//	判断当前专辑是否上架：
		if ("1".equals(albumInfoVo.getIsOpen())){
			//	上架
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_UPPER,albumId);
		} else {
			//	下架
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_LOWER,albumId);
		}

	}

	@Override
	public AlbumInfo getAlbumInfo(Long albumId) {
		//	创建对象
		AlbumInfo albumInfo = this.getById(albumId);
		//	判断
		if (null != albumInfo){
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId)));
		}
		//	返回数据
		return albumInfo;
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void removeAlbumInfoById(Long albumId) {
		//	album_info
		albumInfoMapper.deleteById(albumId);
		//	album_attribute_value
		//	delete from album_attribute_value where album_id = ?  物理删除
		//	逻辑删除 update album_attribute_value set is_deleted = 1 where album_id = ?
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
		//	album_stat
		albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, albumId));
	}

	@Override
	public IPage<AlbumListVo> findUserAlbumPage(AlbumInfoQuery albumInfoQuery, Page<AlbumListVo> page) {
		//	查询专辑列表： 专辑信息+专辑统计信息！
		return albumInfoMapper.selectUserAlbumPage(albumInfoQuery,page);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo,Long userId) {
		/*
			album_attribute_value
			album_info -- 有些数据是页面没有传递的！
			album_stat
		 */
		//	创建专辑对象
		AlbumInfo albumInfo = new AlbumInfo();
		//	给专辑对象赋值--对相同属性才会进行拷贝！
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		albumInfo.setUserId(userId);
		//	tracks_for_free 免费 专辑类型：免费，vip免费，付费
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfoVo.getPayType())){
			//	除免费类型之外，要设置免费试听集数
			albumInfo.setTracksForFree(5);
		}
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		albumInfoMapper.insert(albumInfo);
		//	保存专辑对应的属性与属性值！
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			//	循环遍历
			for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
				//	创建对象
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				//	赋值：album_id
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				//	因为插入操作在当前代码之前 @TableId(type = IdType.AUTO) 这个属性表示能够获取到插入之后的主键Id
				albumAttributeValue.setAlbumId(albumInfo.getId());
				//	循环遍历执行n次insert into;
				albumAttributeValueMapper.insert(albumAttributeValue);
			}
			//	可以优化变为批量保存.
		}
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY);
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_SUBSCRIBE);
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_BROWSE);
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_COMMENT);

		//	判断是否上架
		if ("1".equals(albumInfoVo.getIsOpen())){
			//	上架
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_UPPER,albumInfo.getId());
		}
	}

	public void saveAlbumStat(Long albumId, String statPlay) {
		//	创建对象
		AlbumStat albumStat = new AlbumStat();
		//	赋值
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statPlay);
		albumStat.setStatNum(new Random().nextInt(10000000));
		//	保存
		albumStatMapper.insert(albumStat);
	}
}
